import asyncio
from apscheduler.schedulers.asyncio import AsyncIOScheduler
from datetime import datetime, timedelta

class TaskScheduler:
    def __init__(self):
        # 初始化调度器
        self.scheduler = AsyncIOScheduler()
        self.scheduler.start()  # 启动调度器
        self.jobs = {}

    def add_func_job(self, job_id: str, job_func, minutes, *args, **kwargs):
        job = self.scheduler.add_job(
            job_func,
            'date',  # 使用 'date' 类型触发器
            run_date=datetime.now() + timedelta(minutes=minutes),  # 10分钟后执行
            id=job_id,  # 唯一的任务 ID
            args=args,
            kwargs=kwargs
        )
        # 添加定时任务
        self.jobs[job_id] = job
        print(f"任务 {job_id} 启动成功{minutes}分钟后执行")
        return f"任务 {job_id} 启动成功"

    def start_job(self, job_id: str, interval_seconds: int, cron: dict, job_func, *args, **kwargs):
        """启动定时任务"""
        if not asyncio.iscoroutinefunction(job_func):
            raise ValueError("任务函数必须是异步函数")
        if cron:
            # 如果提供了 Cron 表达式，则使用 Cron 调度,定时任务
            job = self.scheduler.add_job(
                job_func,
                'cron',
                id=job_id,
                day=cron.get('day', None),
                hour=cron.get('hour', 0),
                minute=cron.get('minute', 0),
                second=cron.get('second', 0),
                args=args,
                kwargs=kwargs
            )
        else:
            job = self.scheduler.add_job(
                job_func,
                'interval',
                seconds=interval_seconds,
                id=job_id,
                max_instances=3,
                args=args,
                kwargs=kwargs
            )
        # 添加定时任务
        self.jobs[job_id] = job
        return f"任务 {job_id} 启动成功"

    def stop_job(self, job_id: str):
        """停止指定任务"""
        job = self.jobs.get(job_id)
        if job:
            job.remove()
            del self.jobs[job_id]
            return f"任务 {job_id} 已停止"
        return f"任务 {job_id} 未找到"

    def get_jobs(self):
        """获取当前所有任务的 ID"""
        return [int(job.id.replace('my_job', '')) for job in self.scheduler.get_jobs()]
